package com.t.bricks.bussiness.model.agent;

import com.t.bricks.utils.function.data.UUIDUtil;
import com.t.bricks.utils.function.encode.MD5Util;

/**
 * 转发信息
 */
public class AgentInfo {

	/**
	 * 请求的编号,用于区分不同次的请求,同时返回时也要返回这个号
	 */
	private String sId;
	
	/**
	 * 真实请求的URL
	 */
	private String sUrl;
	
	/**
	 * 请求方式(POST/GET)
	 */
	private String sMethodType;
	
	/**
	 * 请求参数(json结构)
	 */
	private String sParams;
	
	/**
	 * json类型参数
	 */
	private Integer iJsonParam=2;
	
	/**
	 * 请求时间
	 */
	private Long dTime;
	
	/**
	 * 验证密钥
	 */
	private String sReakey;
	
	/**
	 * 构造函数
	 */
	public AgentInfo() {
		
	}

	/**
	 * 构造函数
	 * @param sId
	 * @param sUrl
	 * @param sMethodType
	 * @param sParams
	 * @param iJsonParam
	 * @param dTime
	 * @param sReakey
	 */
	public AgentInfo(String sId, String sUrl, String sMethodType, String sParams,
			Integer iJsonParam, Long dTime, String sReakey) {
		this.sId = sId;
		this.sUrl = sUrl;
		this.sMethodType = sMethodType;
		this.sParams = sParams;
		this.iJsonParam = iJsonParam == null ? 2 : iJsonParam;
		this.dTime = dTime;
		this.sReakey = sReakey;
	}

	/**
	 * 构造函数
	 * @param sId
	 * @param sUrl
	 * @param sMethodType
	 * @param sParams
	 * @param iJsonParam
	 * @param dTime
	 */
	public AgentInfo(String sId, String sUrl, String sMethodType, String sParams,
			Integer iJsonParam, Long dTime) {
		this.sId = sId;
		this.sUrl = sUrl;
		this.sMethodType = sMethodType;
		this.sParams = sParams;
		this.iJsonParam = iJsonParam == null ? 2 : iJsonParam;
		this.dTime = dTime;
		this.sReakey = this.createReakey();
	}

	/**
	 * 构造函数
	 * @param sId
	 * @param sUrl
	 * @param sMethodType
	 * @param sParams
	 * @param dTime
	 * @param sReakey
	 */
	public AgentInfo(String sUrl, String sMethodType, String sParams) {
		this.sId = UUIDUtil.get();
		this.sUrl = sUrl;
		this.sMethodType = sMethodType;
		this.sParams = sParams;
		this.iJsonParam = iJsonParam == null ? 2 : iJsonParam;
		this.dTime = System.currentTimeMillis();
		this.sReakey = this.createReakey();
	}

	/**
	 * 获得 请求的编号,用于区分不同次的请求,同时返回时也要返回这个号
	 * @return sId 请求的编号,用于区分不同次的请求,同时返回时也要返回这个号
	 */
	public String getsId() {
		return sId;
	}

	/**
	 * 设置 请求的编号,用于区分不同次的请求,同时返回时也要返回这个号
	 * @param sId 请求的编号,用于区分不同次的请求,同时返回时也要返回这个号
	 */
	public void setsId(String sId) {
		this.sId = sId;
	}

	/**
	 * 获得 真实请求的URL
	 * @return sUrl 真实请求的URL
	 */
	public String getsUrl() {
		return sUrl;
	}

	/**
	 * 设置 真实请求的URL
	 * @param sUrl 真实请求的URL
	 */
	public void setsUrl(String sUrl) {
		this.sUrl = sUrl;
	}

	/**
	 * 获得 请求方式(POSTGET)
	 * @return sMethodType 请求方式(POSTGET)
	 */
	public String getsMethodType() {
		return sMethodType;
	}

	/**
	 * 设置 请求方式(POSTGET)
	 * @param sMethodType 请求方式(POSTGET)
	 */
	public void setsMethodType(String sMethodType) {
		this.sMethodType = sMethodType;
	}

	/**
	 * 获得 请求参数(json结构)
	 * @return sParams 请求参数(json结构)
	 */
	public String getsParams() {
		return sParams;
	}

	/**
	 * 设置 请求参数(json结构)
	 * @param sParams 请求参数(json结构)
	 */
	public void setsParams(String sParams) {
		this.sParams = sParams;
	}

	/**
	 * 获得 json类型参数
	 * @return iJsonParam json类型参数
	 */
	public Integer getiJsonParam() {
		return iJsonParam;
	}

	/**
	 * 设置 json类型参数
	 * @param iJsonParam json类型参数
	 */
	public void setiJsonParam(Integer iJsonParam) {
		this.iJsonParam = iJsonParam;
	}

	/**
	 * 获得 请求时间
	 * @return dTime 请求时间
	 */
	public Long getdTime() {
		return dTime;
	}

	/**
	 * 设置 请求时间
	 * @param dTime 请求时间
	 */
	public void setdTime(Long dTime) {
		this.dTime = dTime;
	}

	/**
	 * 获得 验证密钥
	 * @return sReakey 验证密钥
	 */
	public String getsReakey() {
		return sReakey;
	}

	/**
	 * 创建验证密钥
	 * @return
	 */
	public String createReakey() {
		String result = new StringBuilder()
			.append(sId).append(";")
			.append(sUrl).append(";")
			.append(sMethodType).append(";")
			.append(sParams).append(";")
			.append(iJsonParam).append(";")
			.append(dTime.toString()).append(";")
			.toString();
		
		result = MD5Util.md5(result);
		
		return result;
	}
	
	/**
	 * 验证信息是否正确
	 * @return
	 */
	public String valid() {
		String temp = createReakey();
		
		if (!temp.equalsIgnoreCase(sReakey)) {
			return "验证密钥错误";
		}
		
		if (0 == dTime.intValue()) {
			return "信息过期";
		}
		
		if ((System.currentTimeMillis() - dTime) > 300000) {
			return "信息过期";
		}
		
		return null;
	}

}
